home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Modules / BackSpaceModules / Source / TanCircle / TanCircleView.m < prev   
Text File  |  1991-10-26  |  3KB  |  174 lines

  1.  
  2. #import    <stdlib.h>
  3. #import    <libc.h>
  4. #import    <math.h>
  5. #import    <time.h>
  6. #import <sys/time.h>
  7. #import    <appkit/Application.h>
  8. #import    <appkit/Slider.h>
  9. #import    <appkit/Button.h>
  10. #import    <appkit/NXImage.h>
  11. #import    <dpsclient/wraps.h>
  12. #import    "TanCircleView.h"
  13.  
  14. @implementation TanCircleView
  15.  
  16. /**********************************************************************/
  17.  
  18. - ( int ) distance : ( int ) x : ( int ) y : ( int ) i
  19. {
  20.     int    xdist;
  21.     int    ydist;
  22.     int    distsq;
  23.     
  24.     xdist = x - Circles[ i ].x;
  25.     ydist = y - Circles[ i ].y;
  26.     distsq = xdist * xdist + ydist * ydist;
  27.     
  28.     return ( sqrt( distsq ) - Circles[ i ].r );
  29. }
  30.  
  31. /**********************************************************************/
  32.  
  33. - ( int ) newRadius : ( int ) x : ( int ) y
  34. {
  35.     int    i;
  36.     int    radius;
  37.     
  38.     radius = MaxRadius;
  39.     
  40.     for( i = 0; i < CurCircle; ++i )
  41.     {
  42.         radius = MIN( radius, [ self distance:x:y:i ] );
  43.         
  44.         if( radius <= 0 )
  45.             break;
  46.     }
  47.     
  48.     return radius;
  49. }
  50.  
  51. /**********************************************************************/
  52.  
  53. - ( const char * ) windowTitle
  54. {
  55.     return ( const char * ) "Tangent Circles";
  56. }
  57.  
  58. /**********************************************************************/
  59.  
  60. - newWindow
  61. {
  62.     [ self genFirstCircle ];
  63.     CurCircle = 1;
  64.     
  65.     return self;
  66. }
  67.  
  68. /**********************************************************************/ 
  69.  
  70. - initFrame : ( const NXRect * ) frameRect
  71. {
  72.     [ super initFrame : frameRect ];
  73.     
  74.     [ self setOpaque : YES ];
  75.     
  76.     CurCircle = MAXCIRCLES;
  77.     
  78.     return self;
  79. }
  80.  
  81. /**********************************************************************/
  82.  
  83. - sizeTo : ( NXCoord ) width : ( NXCoord ) height
  84. {
  85.     [ super sizeTo : width : height ];
  86.     
  87.     [ self genFirstCircle ];
  88.     
  89.     return self;
  90. }
  91.  
  92. /**********************************************************************/
  93.  
  94. - drawSelf : ( NXRect * ) r : ( int ) count
  95. {
  96.     if ( !r || !count )
  97.         return self;
  98.         
  99.     PSsetgray( NX_BLACK );
  100.     
  101.     NXRectFill( r );
  102.     
  103.     return self;
  104. }
  105.  
  106. /**********************************************************************/
  107.  
  108. - genFirstCircle
  109. {
  110.     struct    timeval        tp;
  111.     struct    timezone    tzp;
  112.     
  113.     CurColor = MINCOLOR;
  114.  
  115.     gettimeofday( &tp, &tzp );
  116.     
  117.     srandom( ( int ) tp.tv_sec );
  118.     
  119.     Max_X = bounds.size.width;
  120.     Max_Y = bounds.size.height;
  121.  
  122.     MaxRadius = MAX( Max_X, Max_Y );
  123.     MaxRadius /= 8;
  124.         
  125.     X_pos = ( int ) ( random( ) % Max_X );
  126.     Y_pos = ( int ) ( random( ) % Max_Y );
  127.     Radius = ( int ) ( random( ) % MaxRadius );
  128.     
  129.     Circles[ 0 ].x = X_pos;
  130.     Circles[ 0 ].y = Y_pos;
  131.     Circles[ 0 ].r = Radius;
  132.     
  133.     return self;
  134. }
  135.  
  136. /**********************************************************************/
  137.  
  138. - oneStep
  139. {
  140.     if( ++CurCircle >= MAXCIRCLES )
  141.     {
  142.         CurCircle = 1;
  143.         [ self genFirstCircle ];
  144. //         [ self display ];
  145.     }
  146.     
  147.     do
  148.     {
  149.         X_pos = ( int ) ( random( ) % Max_X );
  150.         Y_pos = ( int ) ( random( ) % Max_Y );
  151.         Radius = [ self newRadius : X_pos : Y_pos ];
  152.     }
  153.     while ( Radius <= 0 );
  154.         
  155.     Radius = MIN( MaxRadius, Radius );
  156.     
  157.     PSnewpath( );    
  158.     PSsetgray( CurColor );
  159.     PSarc( X_pos, Y_pos, Radius, 0, 360 );
  160.     PSfill( );
  161.         
  162.     Circles[ CurCircle ].x = X_pos;
  163.     Circles[ CurCircle ].y = Y_pos;
  164.     Circles[ CurCircle ].r = Radius;
  165.     
  166.     CurColor = ( CurColor >= MAXCOLOR ) ? MINCOLOR : CurColor + COLORINC;
  167.     
  168.     return self;
  169. }
  170.  
  171. /**********************************************************************/
  172.  
  173. @end
  174.